Research
Security News
Malicious npm Packages Inject SSH Backdoors via Typosquatted Libraries
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
@hazae41/option
Advanced tools
Rust-like Option for TypeScript
npm i @hazae41/option
unwrap()
for throwingunwrapOr()
for default valuemap()
for mapping (sync/async)isSome()
/isNone()
type guardsok()
/okOr()
for converting to Result from @hazae41/result
TLDR undefined
is too low level and often leads to ugly and repetitive design patterns or bugs
When designing a function, you often encounter the case where you can't pass undefined
.
function doSomething(text: string) {
return Buffer.from(text, "utf8").toString("base64")
}
function bigFunction(text?: string) {
// ...
doSomething(text) // what if text is undefined?
// ...
}
So you end up checking for undefined
function bigFunction(text?: string) {
// ...
if (text !== undefined) {
doSomething(text)
}
// ...
}
This is annoying if we want to get the returned value
function bigFunction(text?: string) {
// ...
if (text !== undefined) {
const text2 = doSomething(text)
}
// can't use text2
}
Checks become redundant if you need to map the value or throw an error
function bigFunction(text?: string) {
// ...
const text2 = text === undefined
? undefined
: doSomething(text)
// ...
const text3 = text2 === undefined
? undefined
: doSomethingElse(text2)
// ...
if (text3 === undefined)
throw new Error(`something is wrong`)
// use text3
}
Why not check for undefined
in the callee then?
function maybeDoSomething(text?: string) {
if (text === undefined) return
return Buffer.from(text, "utf8").toString("base64")
}
If you know your argument is NOT undefined
, it will force you to check for undefined
after the call
function bigFunction(text: string) {
// ...
const text2 = doSomething(text) // text is never undefined
// text2 can now be undefined
}
Or even worse, force you to use type assertion
function bigFunction(text: string) {
// ...
const text2 = doSomething(text) as string
// ...
}
Let's keep the original function and create an intermediary function for undefined
function maybeDoSomething(text?: string) {
if (text === undefined) return
return doSomething(text)
}
Now you have twice the amount of function in your app, and if one of them changes you have to change its intermediary function too
function bigFunction(text?: string) {
const maybeText = Option.from(text)
// ...
// you want to map it?
const maybeText2 = maybeText.mapSync(doSomething)
// ...
// you want to map it again?
const maybeText3 = maybeText2.mapSync(doSomethingElse)
// ...
// you want to quickly throw an error?
const text4 = maybeText3.unwrap() // string
// you want to throw a custom error?
const text4 = maybeText3.okOr(new Error(`Something is wrong`)).unwrap()
// you want to get a result?
const text4 = maybeText3.ok() // Result<string, Error>
// you want to get a custom result?
const text4 = maybeText3.okOr(new Error(`Something is wrong`))
// you want to come back to "string | undefined"?
const text4 = maybeText3.inner // string | undefined
// you want to do manual check?
if (maybeText3.isSome())
const text4 = maybeText3.inner // string
else
// ...
}
FAQs
Rust-like Option for TypeScript
We found that @hazae41/option demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.